/*******************************************************************
  block-01 start 调用 node.js 获取版本号                     
*******************************************************************/
// preload.js
// 所有的 Node.js API接口 都可以在 preload 进程中被调用.
// 它拥有与Chrome扩展一样的沙盒。
// 浏览器完成初始HTML文档的加载和解析后（不包括图片、样式表等异步资源），
// 会执行花括号内的匿名函数。这意味着里面的代码会在页面内容可被操作时立即执行，而不需要等待所有资源加载完毕。
// block-01 当 dom 加载完成后，获取
window.addEventListener('DOMContentLoaded', () => {
  // 替换函数
  const replaceText = (nodeName, text) => {
    const element = document.getElementById(nodeName)
    if (element) element.innerText = text
  }
  for (const dependency of ['chrome', 'node', 'electron']) {
      // 调用替换函数
      // process.versions[dependency] 获取当前环境中对应依赖的版本号
      // process 对象是 Node.js 环境中的全局对象，这段代码表明这是在 Electron 环境中，因为 Electron 兼容 Node.js API
      // ${dependency} 是取变量，动态地生成一个字符串
      // 反引号 `${...}` 用来表示模板字面量
      // 反引号和${...}语法组合在一起，能在字符串中嵌入变量和表达式，实现动态字符串生成。
    replaceText(`${dependency}-version`, process.versions[dependency])
    // 内置的 Node.js 版本
    console.log('内置的 Node.js 版本：'+process.versions['node'])
  }
})
/*******************************************************************
  block-01 end  调用 node.js 获取版本号                      
*******************************************************************/ 

/*******************************************************************
  block-02 start                 
*******************************************************************/ 
// 通过 contextBridge 接口 定义 全局对象。
const { contextBridge, ipcRenderer} = require('electron/renderer')

// 通过 versions 这一全局变量，将 Electron 的 process.versions 对象暴露给渲染器。
// 定义全局变量：versions，并暴露 process.versions 对象。
contextBridge.exposeInMainWorld('versions', {
  node: () => process.versions.node,
  chrome: () => process.versions.chrome,
  electron: () => process.versions.electron,
  aa: () => '全局字符串对象',
  
  test_ping: (p1) => ipcRenderer.invoke(p1),
})

contextBridge.exposeInMainWorld('ipcRendererApi',{
  // 渲染进程中异步地请求主进程中的某些功能，渲染进程先调用，等待主进程响应
  ping: () => ipcRenderer.invoke('pinggg'),
})

contextBridge.exposeInMainWorld('electronAPI', {
  // 模式 1：渲染器进程到主进程（单向）
  setTitle: (title) => ipcRenderer.send('set-title', title),
  // 模式 2：渲染器进程到主进程（双向）
  // IPC 通道名称上的 dialog: 前缀对代码没有影响。 它仅用作命名空间以帮助提高代码的可读性。
  openFile: () => ipcRenderer.invoke('dialog:openFile'),
  // 模式 3：主进程到渲染器进程
  // 向渲染器暴露 ipcRenderer.on
  onUpdateCounter: (callback) => ipcRenderer.on('update-counter', (_event, value) => callback(value)),
  counterValue: (value) => ipcRenderer.send('counter-value', value)
})



